package com.hy.study.sort;

import java.util.Arrays;

/**
 * 快速排序
 */
public class QuickSort {

    public static void main(String[] args) {
 //       int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
       int arr[] = new int[800000];
       for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 800000);
        }
        System.out.println("----------排序前----------");
      //  System.out.println(Arrays.toString(arr));

        long startTime = System.currentTimeMillis();
        quickSort(arr,0,arr.length-1);//移位式
        long endTime = System.currentTimeMillis();
        System.out.println("----------排序后----------");
        //  System.out.println(Arrays.toString(arr));
        System.out.println("---------总共耗时(" + (endTime - startTime) / 1000 + "秒)");

    }

    /**
     * 快速排序
     *
     * @param arr   待排序的数组
     * @param left  左下标
     * @param right 右下标
     */

    public static void quickSort(int arr[], int left, int right) {

        int l = left;
        int r = right;
        //pivot 中轴值
        int pivot = arr[(left + right) / 2];
        int temp = 0;
        //这里循环的目的就是让比prvot值小放左边
        //比privo值大放右边
        while (l < r) {
            //在pivot的左边一直找 找到一个大于等于prvot的值
            while (arr[l] < pivot) {
                l += 1;
            }
            while (arr[r] > pivot) {
                r -= 1;
            }
            //说明pivot的左右两边的值，已经按照左边全是小于等于pivot 的值，右边全部是大于等于pivot的值
            if (l >= r) {
                break;
            }
            //交换
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            //如果交换完成之后 发现arr[l]=pivot值相等 r--
            if(arr[l]==pivot){
                r--;
            }
            if(arr[r]==pivot){
                l++;
            }
        }
        //如果l==r 必须l++ r-- 否则会栈溢出
        if(l==r){
            l++;
            r--;
        }
        //向左递归
        if(left<r){
            quickSort(arr,left,r);
        }
        //向右递归
        if(right>l){
            quickSort(arr,l,right);
        }

    }
}
